package seqlist.stack;

import java.util.ArrayList;
import java.util.List;
import java.util.NoSuchElementException;

/**
 *  基于动态数组实现的顺序栈
 */
public class MyStack<E> {
    //记录当前元素个数
    private int size;
    //实际储存数据的动态数组，此时在栈中只能在数组末尾添加和删除元素
    private List<E> data = new ArrayList<>();

    /**
     * 向当前栈中添加元素 -> 压栈操作
     */
    public void push(E val){
        this.data.add(val);
        size ++;
    }

    /**
     * 弹出当前的栈顶元素,返回栈顶元素的值
     */
    public E pop(){
        //其实就是动态数组的尾删，但需要先判断是否为空
        if(isEmpty()){
            // 栈为空无法弹出,弄个异常
            throw new NoSuchElementException("stack is empty!cannot pop!");
        }
        //数组末尾删除元素
        E rep = data.remove(size - 1);
        size --;
        return rep;
    }

    //判断当前栈是否为空
    private boolean isEmpty() {
        return size == 0;
    }

    /**
     * 查看当前栈顶元素值，不弹出该元素
     */
    public E peck(){
        if(isEmpty()){
            throw new NoSuchElementException("stack is empty!cannot peek");
        }
        return data.get(size - 1);
    }

    @Override
    public String toString() {
      StringBuilder sb = new StringBuilder();
      sb.append("[");
        for (int i = 0; i < size; i++) {
            sb.append(data.get(i));
            if(i != size - 1){
                sb.append(", ");
            }
        }
        sb.append("]");
        return sb.toString();//最后把sb转换为字符串，并返回
    }
}
